from .base import BaseModel
from .ip import IPAddress
from .domain import Domain

class Asset(BaseModel):
    """资产模型"""
    
    def __init__(self):
        super().__init__()
        self.asset_id = None  # 资产ID
        self.asset_name = None  # 资产名称
        self.ip = None  # IP地址
        self.port = None  # 端口
        self.domain = None  # 域名
        self.asset_protocol = None  # 协议
        self.asset_tags = None  # 标签
        self.owner_id = None  # 所属单位ID
        self.owner_name = None  # 所属单位名称
        self.create_time = None  # 创建时间
        self.update_time = None  # 更新时间
        # 额外属性（非数据库字段）
        self.fingerprint = None  # 指纹
        self.title = None  # 标题
    
    def __str__(self):
        return f"Asset(id={self.asset_id}, name={self.asset_name}, ip={self.ip}, port={self.port}, protocol={self.asset_protocol})"
    
    def to_dict(self):
        """将模型转换为字典格式"""
        return {
            'asset_id': self.asset_id,
            'asset_name': self.asset_name if self.asset_name else '-',
            'ip': self.ip if self.ip else '-',
            'domain': self.domain if self.domain else '-',
            'port': self.port,
            'asset_protocol': self.asset_protocol,
            'asset_tags': self.asset_tags,
            'owner_id': self.owner_id,
            'owner_name': self.owner_name if self.owner_name else '无',
            'create_time': self.create_time.strftime('%Y-%m-%d %H:%M:%S') if self.create_time else None,
            'update_time': self.update_time.strftime('%Y-%m-%d %H:%M:%S') if self.update_time else None
        }
    
    def parse_tags(self):
        """解析标签字段，提取fingerprint和title信息"""
        if not self.asset_tags:
            self.fingerprint = None
            self.title = None
            return
        
        tags = self.asset_tags.split(',')
        for tag in tags:
            if tag.startswith('fingerprint:'):
                self.fingerprint = tag[12:]
            elif tag.startswith('title:'):
                self.title = tag[6:]
    
    def build_tags(self):
        """根据fingerprint和title构建标签字段"""
        tags = []
        if self.fingerprint:
            tags.append(f"fingerprint:{self.fingerprint}")
        if self.title:
            tags.append(f"title:{self.title}")
        
        self.asset_tags = ",".join(tags) if tags else None
        return self.asset_tags
    
    def is_valid(self):
        """验证资产信息是否有效"""
        # 检查必要字段
        if not self.port or not self.asset_protocol:
            return False, "缺少端口或协议"
        
        # 检查IP和域名至少有一个
        if not self.ip and not self.domain:
            return False, "缺少IP和域名"
        
        # 验证IP格式（如果提供了IP）
        if self.ip:
            ip_model = IPAddress()
            ip_model.ip = self.ip
            if not ip_model.is_valid():
                return False, f"IP地址 '{self.ip}' 格式无效"
        
        # 验证域名格式（如果提供了域名）
        if self.domain:
            domain_model = Domain()
            domain_model.domain = self.domain
            if not domain_model.is_valid():
                return False, f"域名 '{self.domain}' 格式无效"
        
        return True, "验证通过"